<?php
/**
 * OrangeHRM is a comprehensive Human Resource Management (HRM) System that captures
 * all the essential functionalities required for any enterprise.
 * Copyright (C) 2006 OrangeHRM Inc., http://www.orangehrm.com
 *
 * OrangeHRM is free software; you can redistribute it and/or modify it under the terms of
 * the GNU General Public License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * OrangeHRM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program;
 * if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA  02110-1301, USA
 */

use Orangehrm\Rest\Api\Entity\Serializable;
use Orangehrm\Rest\Api\Model\ModelTrait;

/**
 * @group API
 */
class ModelTraitTest extends PHPUnit\Framework\TestCase
{
    public function testSetEntity()
    {
        $testEntity = new TestEntity();
        $testEntity->setName('TestName');
        $testEntity->setValue('TestValue');

        $testModel = new TestModel($testEntity);
        $array = $testModel->toArray();
        $this->assertEquals(['name' => 'TestName'], $array);
        $this->assertEquals(1, count($array));
    }

    public function testSetFilters()
    {
        $testEntity = new TestEntity();
        $testEntity->setName('TestName');
        $testEntity->setValue('TestValue');

        $testModel = new TestModel($testEntity);
        $testModel->setTestFilters(['value']);
        $array = $testModel->toArray();
        $this->assertEquals(['value' => 'TestValue'], $array);
        $this->assertEquals(1, count($array));
    }

    public function testSetAttributeNames()
    {
        $testEntity = new TestEntity();
        $testEntity->setName('TestUniqueName');
        $testEntity->setValue('TestValue');

        $testModel = new TestModel($testEntity);
        $testModel->setTestFilters(['name', 'value']);
        $testModel->setTestAttributeNames(['uniqueName', 'value']);
        $array = $testModel->toArray();
        $this->assertEquals(['value' => 'TestValue', 'uniqueName' => 'TestUniqueName'], $array);
        $this->assertEquals(2, count($array));
    }
}

class TestEntity implements Serializable
{
    private $name = null;
    private $value = null;

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getValue()
    {
        return $this->value;
    }

    public function setValue($value)
    {
        $this->value = $value;
    }

    public function toArray()
    {
        return [];
    }
}

class TestModel implements Serializable
{
    use ModelTrait;

    public function __construct(TestEntity $testEntity)
    {
        $this->setEntity($testEntity);
        $this->setFilters(['name']);
    }

    public function setTestFilters($filters)
    {
        $this->setFilters($filters);
    }

    public function setTestAttributeNames($attributeNames)
    {
        $this->setAttributeNames($attributeNames);
    }
}
